# 函数的多返回值
# 本质使用元组打包返回
def test_return():
    return 3, "hello", False


x, y, z = test_return()
print(x, y, z)


# 关键字参数
def info(name, age, sex='man'):  # 默认参数  # 有默认参数则之后的参数必须是默认参数
    print(name, age, sex)


info("张三", 12, "男")
info(sex="男", name="王五", age=15)  # 可以不按照参数顺序传参
info("李四", sex="女", age=44)  # 混用位置参数和关键字参数, 则位置参数必须在关键字参数之前
info("赵六", 80)  # sex使用默认参数


# 不定长参数
# 位置不定长
# 会以元组的形式接收
def info(*args):  # 可以不用args这个名字, 只是编程规范
    print(type(args), args)


info("haha", 1, 4, 2, "Hallo")


# 关键字不定长
# 以字典的形式接收
def info(**kwargs):  # 可以不用kwargs这个名字, 只是编程规范
    print(type(kwargs), kwargs)


info(say="hh", go="no", hihi=666, check=False)  # 要以键=值的形式传参


# 函数作为参数传递
# 传入函数相当于传入一个计算的逻辑(而传参数相当于传入计算的对象)
# 如传入加减乘除的计算逻辑简化代码
def calc(opr):
    print(opr(1, 2))


def add(a, b):
    return a + b


def sub(a, b):
    return a - b


calc(add)
calc(sub)

# lambda匿名函数
# 无法重复使用, 只能使用一次, 代码只写一行
# 不需要return 默认return
calc(lambda a, b: a + b)
calc(lambda a, b: a - b)
